package com.ciis.system.login.controller;

import com.ciis.base.Constants;
import com.ciis.base.Tools;
import com.ciis.base.annotation.Auth;
import com.ciis.base.utils.SessionUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

/**
 * Created with IntelliJ IDEA.
 * User: zhangdajun
 * Date: 14-5-24
 * Time: 下午3:50
 * To change this template use File | Settings | File Templates.
 * 验证码生成
 */
@RequestMapping("/code")
@Controller
public class SecCodeController {

    @RequestMapping(value="/get", method = RequestMethod.GET)
    @Auth(verifyLogin = false)
    public void generate(HttpServletRequest request,HttpServletResponse response){
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        String code = drawImg(output);
        SessionUtils.setValidateCode(request, code); //放入session
        try {
            ServletOutputStream out = response.getOutputStream();
            Cookie cookie = new Cookie(Constants.SESSION_SECURITY_CODE, code);
            response.addCookie(cookie);
            output.writeTo(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @RequestMapping(value="/validate/{code}",method = RequestMethod.GET)
    @Auth(verifyLogin = false)
    public @ResponseBody boolean validateCode(HttpSession session,@PathVariable(value="code")String code) throws Exception{
        String inputCode = String.valueOf(session.getAttribute(Constants.SESSION_SECURITY_CODE));
        if(Tools.notEmpty(code) && Tools.notEmpty(inputCode) &&  code.equals(inputCode)){
            return true;
        }
        return false;
    }

    private String drawImg(ByteArrayOutputStream output){
        String code = "";
        for(int i=0; i<4; i++){
            code += randomChar();
        }
        int width = 70;
        int height = 25;
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
        Font font = new Font("Times New Roman",Font.PLAIN,20);
        Graphics2D g = bi.createGraphics();
        g.setFont(font);
        Color color = new Color(66,2,82);
        g.setColor(color);
        g.setBackground(new Color(226,226,240));
        g.clearRect(0, 0, width, height);
        FontRenderContext context = g.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(code, context);
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = bounds.getY();
        double baseY = y - ascent;
        g.drawString(code, (int)x, (int)baseY);
        g.dispose();
        try {
            ImageIO.write(bi, "jpg", output);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return code;
    }

    private char randomChar(){
        Random r = new Random();
        String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
        return s.charAt(r.nextInt(s.length()));
    }
}
